<?php
require_once "./Application/Common/Common/arrayList.php";

/**
*检查是否在黑名单中
*@param string $input  输入字符串，包括邮箱，国家，IP，信用卡等
*/
function isBlacklist($input){
	$oop=M("blacklist");
	$con['bl_value']=$input;
	$list=$oop->where($con)->find();
	if($list)
		return 1;
	else	
		return 0;
}

/**
*根据IP地址获取地理位置信息
*/
function getLocationFromIp($ip){
	$result=\Zhuzhichao\IpLocationZh\Ip::find($ip);
	return $result[1];
}

 /**
 *生成对账单,同时自动更新账户的金额
 *@param $mid  商户号
 *@param $type 对账类型，从1到10
 *@param $amount 对账金额
 *@param $remark  对账原因说明
 *@param $fee  本次对账过程的费用，默认为0
 *@return  返回成功或者失败
*/
function createStatement($mid,$type,$amount,$remark,$fee=0){
if($amount==0)//如果变动金额为0，直接返回
	return true;

$oop=M("merchant");
//启动事务
$oop->startTrans(); 
$con['mh_id']=$mid;
$list=$oop->where($con)->find($mid);
//dump($list);
switch($type){
case 1://创建账户
case 2: //交易成功
case 5://释放保证金
case 7://取消提现
case 8://对账转入
$st_data["st_flag"]=1;
break;
case 3://退款
case 4://拒付
case 6://提现
case 9://对账转出
case 10://交易拒绝
$st_data["st_flag"]=0;
break;
}
//商户账户金额变动
if($st_data['st_flag']){
$result1=$oop->where($con)->setInc("mh_balance",$amount);
$st_data['st_balance']=$list['mh_balance']+$amount;
}else{
$result1=$oop->where($con)->setDec("mh_balance",$amount);
$st_data['st_balance']=$list['mh_balance']-$amount;
}

$st_data['st_mid']=$mid;
$st_data['st_name']=$type;
$st_data['st_fee']=$fee;
$st_data['st_amount']=$amount;
$st_data['st_reason']=$remark;
//dump($st_data);exit;
//对账单
$result2=M("statement")->add($st_data);
 
if($result1 && $result2){
	//提交事务
	$oop->commit();
	return true;
}else{
	//回滚
	$oop->rollback();
	return false;
}
}


/**
*生成代理商对账单，同时更新账户金额
 *@param $mid  代理商ID
 *@param $type 对账类型，从1到8
 *@param $amount 对账金额
 *@param $remark  对账原因说明
 *@param $fee  本次对账过程的费用，默认为0
 *@return  返回成功或者失败
*/
function resellerStatement($aff_id,$type,$amount,$remark,$fee=0){
if($amount==0)//如果变动金额为0，直接返回
	return true;

$oop=M("affiliate");
//启动事务
$oop->startTrans(); 
$con['aff_id']=$aff_id;
$list=$oop->where($con)->find($mid);
//dump($list);
switch($type){
case 1: //交易成功
case 4://交易失败
case 6://提现取消
case 7://对账转入
case 2://交易退款
case 3://交易拒付
$st_data["ar_status"]=1;
break;
case 5://提现
case 8://对账转出
$st_data["ar_status"]=0;
break;
}
//商户账户金额变动
if($st_data['ar_status']){
$result1=$oop->where($con)->setInc("aff_balance",$amount);
$st_data['ar_balance']=$list['aff_balance']+$amount;
}else{
$result1=$oop->where($con)->setDec("aff_balance",$amount);
$st_data['ar_balance']=$list['aff_balance']-$amount;
}

$st_data['ar_aff_id']=$aff_id;
$st_data['ar_type']=$type;
$st_data['ar_fee']=$fee;
$st_data['ar_amount']=$amount;
$st_data['ar_remark']=$remark;
//dump($st_data);exit;
//对账单
$result2=M("affrecord")->add($st_data);
 
if($result1 && $result2){
	//提交事务
	$oop->commit();
	return true;
}else{
	//回滚
	$oop->rollback();
	return false;
}	
}

/**
*返回所有的国家信息列表，同时缓存查询到country_list
*@param 无输入参数
*@return array 返回国家数组
*/	
function getCountryList(){
	$oop=M("countries");
	$list=$oop->field(true)->cache('country_list')->select();
	return $list;
}

/**
*返回所有物流公司列表，同时缓存查询到track_list
*@param 无输入参数
*@return array 返回物流公司列表
*/	
function getTrackList(){
	$oop=M("tracking");
	$list=$oop->field(true)->cache('track_list')->select();
	return $list;
}

/**
*返回某个国家的州列表
*@param int $country_id 国家编号
*@return array 返回州数组
*/	
function getStateList($country_id){
	$oop=M("zones");
	$con['zone_country_id']=$country_id;
	$list=$oop->field(true)->where($con)->select();
	return $list;
}

/**
*返回所有已激活的通道列表,同时缓存通道列表
*@param 无输入参数
*@return array 返回通道数组
*/	
function getChannelList(){
	$oop=M("channels");
	$list=$oop->field(true)->cache("channel_list")->select();
	return $list;
}

function cardhidden($cardNumber,$numToShow=4){
   $char="x";
   $cardShow = substr($cardNumber, -$numToShow);
	for($i=0;$i<strlen($cardNumber)-$numToShow;$i++){
		$char.="x";
	}
   return $char.$cardShow;
}
	
//随机密码生成函数，参数1个，密码的位数
function makePass($length) { 
$possible = "0123456789". 
"abcdefghijklmnopqrstuvwxyz". 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
$str = ""; 
while(strlen($str) <$length) 
{ 
$str .= substr($possible, (rand() % strlen($possible)), 1); 
} 
return($str); 
} 	

//通用查询方法2
//$mist_arr =>模糊查询的数组key=>value
//$accute_arr =>精确查询数据key=>value
//需要计入cookie的数组key
function searchCon($mist_arr=array(),$accute_arr=array(),$cookie_arr=array()){
$con=array();
//如果cookie_arr不为空
if($cookie_arr){
foreach($cookie_arr as $key=>$value){
if(cookie($value)!="")
	$con[$value]=cookie($value);
}
}

/*-----------以上是cookie的查询字段------------*/


//模糊数组
if($mist_arr){

foreach($mist_arr as $key=>$value){
if($value!=""){

if(in_array($key,$cookie_arr))
	cookie($key,$value);

$con[$key]=array("like","%".$value."%");
}
}
}


/*-----------以上是模糊查询字段------------*/

//精确数组
if($accute_arr){
foreach($accute_arr as $key=>$value){
if($value!=""){

if(in_array($key,$cookie_arr))
   cookie($key,$value);

   $con[$key]=$value;
}
}
}


/*-----------以上是精确查询字段------------*/

return $con;

}

//获得实体信息
function getObjectInfo($id,$object,$field=""){
$oop=M($object);
$list=$oop->find($id);
if($field=="")
	return $list;
else
	return $list[$field];

}

function getObjectList($object,$arr="1",$sort="",$num=""){
$oop=D($object);
$list=$oop->field(true)->where($arr)->order($sort)->limit($num)->select();
return $list;
}

/*
*获取表及视图列表加强版, 参数不定，最少3个，最多无数个，但是参数个数必须是奇数，否则无效
*其中前三个，分别是表，排序，列表数
*/
function getObjectPro(){
	$num=func_num_args();
	if($num%2==0 || $num<3)
		return false;
	
	$arr=func_get_args();
	for($i=3;$i<$num;$i+=2){
			$con[$arr[$i]]=$arr[$i+1];
	}
	if(strstr($arr[0],"View"))
		$oop=D($arr[0]);
	else
		$oop=M($arr[0]);
	
	$list=$oop->field(true)->where($con)->order($arr[1])->limit($arr[2])->select();
	return $list;
}


//剪裁字符串
function cut_str($sourcestr,$cutlength){
   $returnstr='';
   $i=0;
   $n=0;
   $str_length=strlen($sourcestr);//字符串的字节数
   while (($n<$cutlength) and ($i<=$str_length))
   {
      $temp_str=substr($sourcestr,$i,1);
      $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
      if ($ascnum>=224)    //如果ASCII位高与224，
      {
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符        
         $i=$i+3;            //实际Byte计为3
         $n++;            //字串长度计1
      }
      elseif ($ascnum>=192) //如果ASCII位高与192，
      {
         $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
         $i=$i+2;            //实际Byte计为2
         $n++;            //字串长度计1
      }
      elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母，
      {
         $returnstr=$returnstr.substr($sourcestr,$i,1);
         $i=$i+1;            //实际的Byte数仍计1个
         $n++;            //但考虑整体美观，大写字母计成一个高位字符
      }
      else                //其他情况下，包括小写字母和半角标点符号，
      {
         $returnstr=$returnstr.substr($sourcestr,$i,1);
         $i=$i+1;            //实际的Byte数计1个
         $n=$n+0.5;        //小写字母和半角标点等与半个高位字符宽...
      }
   }
         if ($str_length>$i){
          $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
      }
    return $returnstr;
}

//分页方法
function pageInfo($oop,$sort="",$con="1=1",$num=35){
 $count      = $oop->where($con)->count();// 查询满足要求的总记录数
 $Page       = new \Common\Common\Mypage($count,$num,"uk-clearfix uk-margin-top","uk-pagination");// 实例化分页类 传入总记录数和每页显示的记录数 
 $data['show']       = $Page->show();// 分页显示输出 // 进行分页数据查询 注意limit方法的参数要使用Page类的属性 
 $data['list'] = $oop->field(true)->where($con)->order($sort)->limit($Page->first_row.','.$Page->list_rows)->select();
 //echo $oop->GetLastSql();
 $data['total_num']=$Page->total_num;//总记录数
 $data['page_num']=$Page->page_num;//总分页
 return $data;
} 

function displayIcon($status=1){

if($status)
	return "<font color=green><b>√</b></font>";
else
	return "<font color=red><b>×</b></font>";
}

function getAreaInfo($parent_id,$json=true){
$oop=M("areas");
$con['parent_id']=$parent_id;
$list=$oop->where($con)->select();
$arr[0]['id']="";
$arr[0]['text']="--Please select--";


foreach($list as $key=>$value){
$arr[$key+1]['id']=$value['area_id'];
$arr[$key+1]['text']=$value['area_name'];
}

if($json)
	return json_encode($arr);
else
	return $list;
}

//验证身份证
function is_idcard( $id ){
    $id = strtoupper($id);
    $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
    $arr_split = array();
    if(!preg_match($regx, $id))
    {
        return FALSE;
    }
    if(15==strlen($id)) //检查15位
    {
        $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";
 
        @preg_match($regx, $id, $arr_split);
        //检查生日日期是否正确
        $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];
        if(!strtotime($dtm_birth))
        {
            return FALSE;
        } else {
            return TRUE;
        }
    }
    else           //检查18位
    {
        $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
        @preg_match($regx, $id, $arr_split);
        $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];
        if(!strtotime($dtm_birth))  //检查生日日期是否正确
        {
            return FALSE;
        }
        else
        {
            //检验18位身份证的校验码是否正确。
            //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
            $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
            $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
            $sign = 0;
            for ( $i = 0; $i < 17; $i++ )
            {
                $b = (int) $id{$i};
                $w = $arr_int[$i];
                $sign += $b * $w;
            }
            $n  = $sign % 11;
            $val_num = $arr_ch[$n];
            if ($val_num != substr($id,17, 1))
            {
                return FALSE;
            }
            else
            {
                return TRUE;
            }
        }
    }
 
}


 /**
 +----------------------------------------------------------
 * 功能：计算文件大小
 +----------------------------------------------------------
 * @param int $bytes
 +----------------------------------------------------------
 * @return string 转换后的字符串
 +----------------------------------------------------------
 */
 function byteFormat($bytes) {
    $sizetext = array(" B", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    return round($bytes / pow(1024, ($i = floor(log($bytes, 1024)))), 2) . $sizetext[$i];
 }
 
 // 无需递归生成树
 // 数组格式
 // $items = array(
 //     1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'),
 //     2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'),
 //     3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'),
 //     4 => array('id' => 4, 'pid' => 3, 'name' => '长丰县'),
 //     5 => array('id' => 5, 'pid' => 1, 'name' => '安庆市'),
 // );	 
 function generateTree($items){
     $tree = array();
     foreach($items as $item){
         if(isset($items[$item['pid']])){
             $items[$item['pid']]['children'][] = &$items[$item['id']];
         }else{
             $tree[] = &$items[$item['id']];
         }
     }
     return $tree;
 }
 
 //信用卡过期年月函数
 function getCardExpiryDate($param="m"){
	if($param=="m"){
		$month_arr=array(
		"01","02","03","04","05","06","07","08","09","10","11","12"
		);
		return $month_arr;
	}else{
		$curr_year=date('y');
		for($i=0;$i<10;$i++){
			$year_arr[$i+$curr_year]="20".$curr_year+$i;
		}
		return $year_arr;
	} 
 }
 
 
 
 

?>